package com.zhu.solution.stringQuestion;

/*字符串中的第一个唯一字符
给定一个字符串，找到它的第一个不重复的字符，并返回它的索引。如果不存在，则返回 -1。

示例：
s = "leetcode"
返回 0

s = "loveleetcode"
返回 2
 
提示：你可以假定该字符串只包含小写字母。

*
* */

import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zhujiabao
 * @Date: 2021/12/14/16:52
 * @Description:
 */
public class StringSolution_3 {

    public static void main(String[] args) {
        String s = "";

        System.out.println(new StringSolution_3().firstUniqChar(s));
        System.out.println(new StringSolution_3().firstUniqChar_2(s));
        System.out.println(new StringSolution_3().firstUniqChar_3(s));
    }

    //第一个思路，嵌套循环，暴力破解
    public int firstUniqChar(String s) {

        char[] chars = s.toCharArray();

        int index;
        for (int i = 0;i<chars.length;i++){
            index = 0;
            for (int j = 0; j<chars.length; j++){
                if (i==j)continue;

                if (chars[i] == chars[j]){
                    index = 1;
                    break;
                }
            }
            if (index==0){
                return i;
            }
        }

        return -1;
    }

    //实现别人的思路，两次循环，用一个26长度的数组带表26个英文字母
    public int firstUniqChar_2(String s) {

        char[] sChar = s.toCharArray();
        if (sChar==null || sChar.length==0){
            return -1;
        }

        int[] count = new int[26];

        //第一次循环直接算出每个字母出现的次数
        for (int i=0; i<sChar.length; i++){
            count[sChar[i]-'a']++;
        }

        //查找count数组第一个值为1的下标
        for (int i=0; i<sChar.length; i++){
            if (count[sChar[i]-'a'] == 1)
                return i;
        }
        return -1;
    }


    //实现别人的思路，直接将第一次统计次数改为用 Map，比直接用数组慢一些
    public int firstUniqChar_3(String s) {
        Map<Character,Integer> mapCount = new HashMap<>();
        char[] sChar = s.toCharArray();
        if (sChar==null || sChar.length==0)
            return -1;

        for (int i=0; i<sChar.length; i++){
            mapCount.put(sChar[i],mapCount.getOrDefault(sChar[i],0)+1);
        }

        for (int i=0; i<sChar.length; i++){
            if (mapCount.get(sChar[i])==1){
                return i;
            }
        }

        return -1;


    }

}
